Muchos tutoriales han declarado que el operador de comparación == es para la igualdad de valores, como en esta respuesta , cita:
==es para la igualdad de valores . Úselo cuando desee saber si dos objetos tienen el mismo valor.ispara la igualdad de referencia . Úselo cuando quiera saber si dos referencias se refieren al mismo objeto.
Sin embargo, descubrí que el documento de Python dice que:
x==yllama ax.__eq__(y). De forma predeterminada, elobjectimplementa__eq__()usandois, devolviendoNotImplementeden el caso de una comparación falsa:True if x is y else NotImplemented.
Parece que el comportamiento predeterminado del operador == es comparar la calidad de la referencia como el operador is , lo que contradice lo que dicen estos tutoriales.
Entonces, ¿para qué exactamente debo usar == ? ¿igualdad de valores o igualdad de referencia? O simplemente depende de cómo implemente el método __eq__ .
Creo que el documento de comparaciones de valores ha ilustrado esta pregunta claramente:
Los operadores
<,>,==,>=,<=y!=comparan los valores de dos objetos. El valor de un objeto es una noción bastante abstracta en Python. Los operadores de comparación implementan una noción particular de cuál es el valor de un objeto. Uno puede pensar en ellos como definiendo el valor de un objeto indirectamente, por medio de su implementación de comparación.
El comportamiento de la comparación de igualdad predeterminada, que las instancias con diferentes identidades siempre son desiguales, puede contrastar con los tipos que necesitarán una definición sensata del valor del objeto y la igualdad basada en el valor. Dichos tipos deberán personalizar su comportamiento de comparación y, de hecho, varios tipos integrados lo han hecho.
El comportamiento predeterminado para la comparación de igualdad (
==y!=) se basa en la identidad de los objetos. Por lo tanto, la comparación de igualdad de instancias con la misma identidad da como resultado la igualdad, y la comparación de igualdad de instancias con diferentes identidades da como resultado la desigualdad. Una motivación para este comportamiento predeterminado es el deseo de que todos los objetos sean reflexivos (es decir,x is yimplicax == y).
También incluye una lista que describe el comportamiento de comparación de los tipos integrados más importantes, como números, cadenas y secuencias, etc.
Depende únicamente de lo que haga __eq__ . El __eq__ predeterminado de tipo object se comporta como is . Algunos tipos de datos incorporados usan su propia implementación. Por ejemplo, dos listas son iguales si todos sus valores son iguales. Solo tienes que saber esto.
object implementa __eq__() usando is , pero muchas clases en la biblioteca estándar implementan __eq__() usando igualdad de valores. P.ej:
>>> l1 = [1, 2, 3] >>> l2 = [1, 2, 3] >>> l3 = l1 >>> l1 is l2 False >>> l1 == l2 True >>> l1 is l3 True En sus propias clases, puede implementar __eq__() como tenga sentido, por ejemplo:
class Point(): def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): return self.x == other.x and self.y == other.xPara agregar su proceso de pensamiento con una definición simple,
El operador Igualdad == compara los valores de ambos operandos y verifica la igualdad de valores. Mientras que el operador is verifica si ambos operandos se refieren al mismo objeto o no (presente en la misma ubicación de memoria).
En pocas palabras, is comprueba si dos referencias apuntan al mismo objeto o no. == comprueba si dos objetos tienen el mismo valor o no.
Por ejemplo:
a=[1,2,3] b=a #a and b point to the same object c=list(a) #c points to different object if a==b: print('#') #output:# if a is b: print('##') #output:## if a==c: print('###') #output:## if a is c: print('####') #no output as c and a point to different object